1

文中列举的代码并不完整
源代码

在iOS的开发中,对于页面偏多的中大型项目来说,使用纯storyboard进行页面构建是比较痛苦的,所有的困难中,首当其冲的是批量修改控件样式。虽然Apple的工程师提供了像appearance这样的特别技术帮助大家批量配置样式,但面对庞大的项目仍有一定的局限性。

处于这种考虑,我们可以尝试扩展UIView的Category,方便我们在软件启动阶段,将所需要的某种大量使用的控件进行缓存,在使用时直接进行克隆操作,减少了代码中重复设置样式的步骤,同时方便后期进行批量样式修改。

首先第一步,我们要实现UIView的clone(克隆)操作

如何clone一个UIView? 使用 NSKeyedArchiver/NSKeyedUnarchiver

核心代码:

+ (__kindof UIView*)duplicate:(__kindof UIView*)view
{
    NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject:view];
    return [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
}

接下来,我们可以使用 - (__kindof UIView*)clone; 方法来克隆一个UIIView

- (UIView *)clone
{
    return [[self class] duplicate:self];
}

将UIView注册为标准模版

我们可以设置key作为模版的标识, 然后使用make block 来配置UIView的样式。

+ (void)registStyle:(NSString*)key make:(void(^)(id view))makeBlock;

举个例子,这里使用的是MDCButton:

[MDCButton registStyle:@"category_button" make:^(MDCButton*  _Nonnull view) {
        view.frame = CGRectMake(15, 30, 50, 50);
        [view setBackgroundColor:[UIColor add_colorWithRGBHexString:@"#178EDA"] forState:UIControlStateNormal];
    }];

当我们需要实例化 category_button 的时候:

MDCButton* clone = [MDCButton cloneForKey:@"category_button"];

实现相同样式多个控件的布局

使用 copyTimes方法来clone并布局多个相同样式的UIView:

- (void)copyTimes:(NSUInteger)times make:(void(^)(id view, NSUInteger idx))makeBlock;

举个例子,排列10个相同的UILabel:

UILabel* label = [[UILabel alloc] init];
    [label copyTimes:10 make:^(id  _Nonnull view, NSUInteger idx) {
      [self.view addSubview:view];
      [view setFrame:CGRectMake(0, idx * 100, 50, 100)];
}];

小结

本文中用到了NSKeyedArchiver/NSKeyedUnarchiver序列化/反序列化操作,来实现UIView对象的克隆,然后使用的语言block特性,批量配置样式,内存缓存的代码可以见源代码,欢迎留言讨论。


秋刀生鱼片
2.1k 声望82 粉丝

独立游戏开发者